package main

import (
	"errors"
	"fmt"
)

/**
内建函数recover允许程序管理恐慌过程中的Go程序。
在defer的函数中，执行recover调用会取回传至panic调用的错误值，恢复正常执行，停止恐慌过程。
若recover在defer的函数之外被调用，它将不会停止恐慌过程序列。
在此情况下，或当该Go程不在恐慌过程中时，或提供给panic的实参为nil时，
recover就会返回nil。
*/

func test() {
	// 利用defer和recover来捕获错误
	defer func() {
		if err := recover(); err != nil {
			fmt.Println("错误信息捕获 ：", err)
		}
	}()
	num := 10
	num2 := 0
	result := num / num2
	fmt.Println(result)
}

// 自定义错误
func test01() (err error) {
	num := 10
	num2 := 0
	if num2 == 0 {
		return errors.New("除数不能为0")
	}
	result := num / num2
	fmt.Println(result)
	return nil
}

// panic 内建函数处理：

func main() {
	test()
	err := test01()
	if err != nil {
		fmt.Println("自定义错误：", err)
		panic(err) // 加上该函数，后面的代码不会执行
	}
	fmt.Println("test函数执行完成")
}
